查看原文
其他

用口诀轻松记住 HTTP 状态码!

编程导航 2023-07-23

The following article is from 面试鸭 Author 编程导航和鱼友们

大家好呀,最近春招开始了,给大家分享一些优质面试题,希望对大家有所帮助~

后端

题目一

什么是反射机制?说说反射机制的优缺点、应用场景?

官方解析

Java 反射机制是指在运行时动态地获取类的信息、创建对象以及调用对象的属性和方法的机制。Java 反射机制提供了运行时检查 Java 类型信息的能力,让 Java 程序可以通过程序获取其本身的信息。

Java 反射机制的优点:

  • 可以动态地获取类的信息,不需要在编译时就知道类的信息。

  • 可以动态地创建对象,不需要在编译时就知道对象的类型。

  • 可以动态地调用对象的属性和方法,可以在运行时动态地改变对象的行为。

Java 反射机制的缺点:

  • 由于反射是动态的,所以它的运行效率较低,不如直接调用方法或属性。
  • 由于反射是动态的,所以它会破坏 Java 的封装性,可能会使代码变得复杂和不稳定。

Java 反射机制的应用场景:

  • 动态代理。动态代理可以使用反射机制在运行时动态地创建代理对象,而不需要在编译时就知道接口的实现类。
  • 单元测试。JUnit 等单元测试框架可以使用反射机制在运行时动态地获取类和方法的信息,实现自动化测试。
  • 配置文件加载。许多框架(如 Spring)使用反射机制来读取和解析配置文件,从而实现依赖注入和面向切面编程等功能。

鱼皮补充:这里如果能像题解的最后一点一样提到哪些框架或者你自己的哪些项目用到了反射,会很加分

鱼友的精彩回答

林寻的回答

反射就是 Reflection,Java 的反射是指程序在运行期可以拿到一个对象的所有信息。正常情况下,如果我们要调用一个对象的方法,或者访问一个对象的字段,通常会传入对象实例

➢在运行时判断任意一个对象所属的类

➢在运行时构造任意一个类的对象

➢在运行时判断任意一个类所具有的成员变量和方法

➢在运行时获取泛型信息

➢在运行时调用任意一个对象的成员变量和方法

➢在运行时处理注解

➢生成动态代理

优点:

➢可以实现动态创建对象和编译,体现出很大的灵活性

缺点:

➢对性能有影响.使用反射基本上是-种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。

yes.的回答

Java的反射机制是指在运行时获得类的信息,创建类的对象,调用其中的方法和属性。反射机制的优点:

  • 可以动态的获取类信息。

  • 可以动态的创建类对象。

  • 可以动态的调用类对象的方法以及属性。反射机制的缺点:

  • 不安全,反射能够获取所有类对象,包括私有的,破坏了程序的封装性。

  • 效率低,反射的效率较低。

应用场景:

  • 动态代理,因为不确定需要代理的类,所以需要通过反射动态的获取
  • RPC 框架,RPC 框架就是动态的生成类对象,然后调用方法的。

鱼皮评论:rpc 这里提的很好

题目二

数据库索引是什么,有什么作用,什么场景适合使用索引?

官方解析

数据库索引是一种数据结构,用于提高数据库表的查询效率。

索引可以帮助数据库快速定位和检索存储在表中的数据,从而加快数据查询的速度。在数据量比较大时,使用索引可以极大地提高数据检索的效率。

索引的作用是通过构建一个额外的数据结构(B-tree、哈希表等)来加速数据的检索。它是在数据库表上创建的一种数据结构,它包含一些指向表中数据的指针,可以快速地定位到满足查询条件的数据行,从而提高查询效率。索引可以包含一个或多个列,可以使用单列索引、组合索引、全文索引等多种方式来创建。

适合使用索引的场景包括:

  • 频繁查询的列,如主键、外键等。
  • 经常作为查询条件的列,如 WHERE、ORDER BY、GROUP BY 等语句中的列。
  • 经常需要连接的列,如多表联合查询时的列。
  • 数据量较大的表,通过索引可以加快数据检索速度。

索引的优点是可以提高数据库的查询速度,缩短数据检索的时间,提高系统的性能。但是索引也有一些缺点,包括:

  • 占用额外的存储空间,增加了存储成本。
  • 建立索引需要时间,增加了系统的开销。
  • 数据库的更新操作(增删改)会导致索引的重建,影响系统的性能。

因此,需要根据实际情况进行索引的创建和使用,避免过度索引导致系统性能下降。

鱼皮补充:这题如果能举例你自己是如何在项目中应用索引的(比如检索用户消息)、或者说什么情况下你没有选择用索引的(比如性别字段),会很加分

鱼友的精彩回答

林风的回答

数据库索引是一种数据结构,就想书的目录一样,它可以帮助我们快速定位到想要的数据。

优点

  • 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。

  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。缺点

  • 需要占用物理空间,数量越大,占用空间越大;

  • 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。

索引不是万能钥匙,它也是根据场景来使用的

什么场景适合使用索引?

  • 频繁使用的列,主键、外键
  • 字段有唯一性限制的,比如商品编码,可以使用唯一索引
  • 经常用于 WHERE 查询条件的字段,这样能够提高整个表的查询速度,如果查询条件不是一个字段,可以建立联合索引。
  • 经常用于 GROUP BY 和 ORDER BY 的字段,这样在查询的时候就不需要再去做一次排序了,因为我们都已经知道了建立索引之后在 B+Tree 中的记录都是排序好的

还有一点要注意的是索引失效的场景,本来使用索引是为了加快检索速度的,一旦索引失效,不仅起不了作用还占用空间。

索引失效

  • 使用函数、计算、类型转换

使用这些以后,索引中存的不是函数计算后的值,自然用不到索引

  • like %xxx %xxx%

不符合最左匹配原则

  • or 只有一边用上了索引,也会导致索引失效
  • 联合索引的最左匹配原则,在遇到范围查询(>、<、between、like 包括like '林%'这种)的时候,就会停止匹配

什么时候不适合创建索引?

  • WHERE 条件,GROUP BY,ORDER BY 里用不到的字段,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的,因为索引是会占用物理空间的。
  • 字段中存在大量重复数据,不需要创建索引,比如性别字段,只有男女,如果数据库表中,男女的记录分布均匀,那么无论搜索哪个值都可能得到一半的数据。在这些情况下,还不如不要索引,因为 MySQL 还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
  • 表数据太少的时候,不需要创建索引;
  • 经常更新的字段不用创建索引,比如不要对电商项目的用户余额建立索引,因为索引字段频繁修改,由于要维护 B+Tree的有序性,那么就需要频繁的重建索引,这个过程是会影响数据库性能的。

题目三

HTTP 有哪些常见的状态码?

官方解析

HTTP(超文本传输协议)常见的状态码有以下几种:

1xx(信息类状态码):指示已经接收到请求,正在继续处理。

2xx(成功状态码):指示请求已经被接收、理解和接受。

  • 200 OK:请求已成功处理。
  • 201 Created:请求已经被实现,而且有一个新的资源已经依据请求的需要而建立。
  • 204 No Content:服务器已经成功处理了请求,但是没有返回任何实体内容。

3xx(重定向状态码):需要进行附加操作以完成请求。

  • 301 Moved Permanently:请求的网页已永久移动到新位置。
  • 302 Found:请求的网页已经临时移动到新位置。
  • 304 Not Modified:客户端发送了一个带条件的请求,服务器端允许请求访问资源,但是请求未满足条件。

4xx(客户端错误状态码):请求包含错误语法或不能被执行。

  • 400 Bad Request:请求报文存在语法错误。
  • 401 Unauthorized:表示发送的请求需要有通过 HTTP 认证的认证信息。
  • 403 Forbidden:表示对请求资源的访问被服务器拒绝。
  • 404 Not Found:请求的资源不存在。

5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。

  • 500 Internal Server Error:服务器遇到了一个未曾预料的状况,导致无法完成对请求的处理。
  • 502 Bad Gateway:充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。
  • 503 Service Unavailable:服务器暂时处于超负载或正在停机维护,无法处理请求。

状态码是服务器对客户端请求结果的反馈,根据状态码可以快速定位问题所在,进行相应的处理。

鱼皮补充:这题建议大家分类记忆,比如 4xx 一般是客户端的问题,5xx 一般是服务端的问题;还可以再幽默一点,比如我们学校的抢课系统经常 503~

鱼友的精彩回答

维萨斯的回答

啥波一口诀 ( 也不用完全记忆 )

一信 二成 三重 四五败

1xx 一信

提示信息,是协议处理的中间状态,还需要后续操作 ( 感觉一般也不会遇到 )

2xx 二成

  • 200 : 常见的成功状态码
  • 204 : 200状态码 - 无Body版
  • 206 : 200状态码 - part版 ( 表示响应返回的body数据不是资源的全部 )

3xx 三重

  • 301 : 永久重定向
  • 302 : 301状态码 - 临时版 ( 临时重定向 )
  • 304 : 不具有跳转意义,表示资源未修改,重定向到缓存 ( 304 Not Modified )

4xx 四败

客户端!!!

  • 404 : 资源不存在或者未找到 ( 404 NOT FOUND )
  • 400 : 请求报文有错误 ( 记忆方法: 400最小 发生在 Http 第一步(发送请求)中 )
  • 401 : 请求需要认证
  • 403 : 禁止访问 ( 403 Forbidden )

5xx 五败

服务端!!

  • 500 : 笼统错误码
  • 502 : 服务器网关或者代理出现问题 ( 502 Bad GateWay )
  • 503 : 服务器正忙,无法处理请求 ( 503 Unavailable )

Ming 的回答

HTTP 会通过状态码来表达请求响应的情况,常用的状态有以下的内容:

1xx:提示信息,中间状态,实际用到的比较少

2xx:表示服务器成功处理了客户端的请求

  • 200 OK
  • 204 No Content 也是成功,但响应头没有 body 信息
  • 206 Partial Content 分块下载,断点续传,表示返回的 body 只是一部分

3xx:表示客户端的请求资源发生了变动,需要客户端用新的 URL 重新发送请求,也就是重定向

  • 301 Moved Permanently 永久重定向,请求的资源不存在了
  • 302 Found 临时重定向,请求资源还在
  • 304 Not Modified 不具有跳转的含义,缓存重定向,用于缓存控制

4xx:客户端发送的报文有误,服务器无法处理

  • 400 Bad Request 客户端请求的豹纹有错误
  • 403 Forbidden 服务器禁止访问
  • 404 Not Found 服务器上不存在

5xx:客户端请求报文正确,但是服务器内部发生了错误,属于服务端的错误码

  • 500 Internal Server Error 服务器内部错误
  • 501 Not Implemented 请求的功能还不支持,即将开业敬请期待
  • 502 Bad Gateway 服务器作为网关和代理返回的错误码
  • 503 Service Unavaliable 服务器很忙

前端

题目一

什么是响应式设计?响应式设计的基本原理是什么?如何进行实现?

官方解析

响应式设计是指通过一些技术手段,使得网站或应用在不同终端设备(如桌面电脑、平板电脑、手机等)上能够自适应地呈现最佳的用户体验。

响应式设计的基本原理是根据屏幕的尺寸和分辨率等信息,动态调整页面的布局和元素的样式,以便使页面在不同的设备上呈现出最佳的效果。实现响应式设计通常需要使用 HTML、CSS 和 JavaScript 技术,其中 CSS 媒体查询是实现响应式设计的核心技术之一。

为了实现响应式设计,开发人员需要为不同屏幕尺寸和分辨率等场景提供不同的布局和样式。一种实现方式是使用流体网格布局和百分比尺寸等技术,以便根据设备屏幕的宽度和高度等信息自适应地调整页面的布局和元素的大小。另一种实现方式是使用 CSS 媒体查询,根据设备的屏幕尺寸和分辨率等信息,加载不同的样式文件或应用不同的样式规则,以便实现不同场景下的最佳效果。

响应式设计的优点包括可以提高用户体验、提高网站访问率和转化率、降低开发成本等。同时,响应式设计也有一些缺点,例如需要在各种设备上进行充分的测试和调试、可能需要加载大量的 CSS 和 JavaScript 文件等。

总之,响应式设计是一种非常重要的前端开发技术,能够帮助开发人员在不同终端设备上提供最佳的用户体验,提高网站的访问率和转化率,同时也能减少开发成本和维护成本。

鱼皮补充:这道题的最后一问 “如何实现” 非常好,能直接反映你的前端经验,可以从最原始的实现(媒体查询)、CSS 响应式布局、组件库框架等方面回答,聊聊自己尝试过的布局

题目二

深拷贝和浅拷贝有什么区别?JS 怎么实现深拷贝?

官方解析

深拷贝和浅拷贝是复制数据结构的两种不同方式。

浅拷贝是创建一个新的对象,新对象的一些属性引用原始对象中相同的属性。这意味着在原始对象或新对象上的更改会相互影响。

深拷贝是创建一个新的对象,并复制原始对象的所有属性,包括嵌套的对象和数组。这意味着在原始对象或新对象上的更改不会相互影响。

在 JavaScript 中,可以通过以下方式实现深拷贝:

JSON.parse() 和 JSON.stringify() 方法

这是实现深拷贝的一种简单方式,但它有一些限制,例如不能复制函数和特殊对象(如 Date)。同时,它不能处理包含循环引用的对象。

以下是使用 JSON.parse() 和 JSON.stringify() 方法实现深拷贝的示例代码:


const obj = { name: 'John', age: 30, address: { city: 'New York', state: 'NY' } };

const obj2 = JSON.parse(JSON.stringify(obj));

obj2.address.city = 'Chicago';

console.log(obj.address.city); // Output: New York
console.log(obj2.address.city); // Output: Chicago

递归拷贝对象

这种方法涉及递归遍历对象,并创建一个新的对象,复制原始对象的属性,并在需要时递归复制嵌套的对象和数组。这种方法可以处理循环引用,并复制函数和特殊对象。

以下是使用递归拷贝对象实现深拷贝的示例代码:

function deepClone(obj) {
  if (typeof obj === 'object' && obj !== null) {
    let result = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        result[key] = deepClone(obj[key]);
      }
    }
    return result;
  }
  return obj;
}

const obj = { name: 'John', age: 30, address: { city: 'New York', state: 'NY' } };

const obj2 = deepClone(obj);

obj2.address.city = 'Chicago';

console.log(obj.address.city); // Output: New York
console.log(obj2.address.city); // Output: Chicago

深拷贝的缺点是它可能会更加耗时,因为需要递归遍历整个对象图,复制所有属性和嵌套的对象和数组。而浅拷贝是一种更快的复制方式,因为它只复制了对象的引用。在某些情况下,浅拷贝可能会更有效。

鱼友的精彩回答

Tri-X 的回答

浅拷贝与深拷贝的主要区别在与对引用类型的复制,深拷贝会复制对象中的数据,改变深拷贝对象中的属性原对象中的属性不会被影响。浅拷贝则是引用该对象,改变其中的属性会影响原来对象中的属性。也要理解浅拷贝与赋值的区别,赋值对于对象中的基本类型采用引用其地址的方式,但浅拷贝会复制基本类型的数据。

浅拷贝可以使用Object.assgin这个方法来拷贝。

深拷贝可以使用JSON.parse(JSON.stringfy())来实现,但是这个方式的缺陷是不能对函数进行拷贝。为了改善这个方法可以使用递归来拷贝。

以下是通过递归来实现深拷贝的代码

function clone(target, map = new Map()) {

if (typeof target === 'object') {

let cloneTarget = Array.isArray(target) ? [] : {};

if (map.get(target)) {

return map.get(target);

}

map.set(target, cloneTarget);

for (const key in target) {

cloneTarget[key] = clone(target[key], map);

}

return cloneTarget;

else {

return target;

}

};

题目三

iframe 标签的作用是什么?有哪些优缺点?

官方解析

<iframe> 标签是 HTML 中的一个元素,用于在当前 HTML 文档中嵌入另一个 HTML 文档。它可以在一个 HTML 页面中嵌入另一个 HTML 页面或其他类型的文档,比如 PDF 文件或视频文件。

<iframe> 标签的主要作用是将一个页面嵌入到另一个页面中。例如,在一个页面中嵌入一个地图或一个视频,或者在一个页面中嵌入一个在线表单,都可以使用 <iframe> 标签。

<iframe> 标签的优点包括:

  • 可以让页面嵌入其他网站或文档,从而扩展页面的功能。
  • 可以使用一个单独的文档来管理页面的内容,从而简化页面的管理。
  • 可以在一个页面中嵌入多个 ,从而允许多个不同的内容在同一页面中显示。

<iframe> 标签的缺点包括:

  • 可能会影响页面的加载速度和性能,特别是在页面中嵌入大型媒体文件时。
  • 可能会影响页面的可访问性,因为屏幕阅读器可能无法读取嵌入的内容。
  • 可能会导致安全风险,因为嵌入的文档可以访问父页面的 JavaScript 对象,从而可能被用于恶意攻击。

要实现 <iframe> 的效果,可以使用以下代码:

<iframe src="http://example.com"></iframe>

其中 src 属性指定要嵌入的文档的 URL,可以是一个 HTML 页面、一个 PDF 文件或一个视频文件等等。通过设置 width 和 height 属性可以指定 <iframe> 元素的尺寸。

鱼皮补充:这题如果有同学能提到部分微前端的实现是基于 iframe 的,会加分

星球活动

1.欢迎参与 30 天面试题挑战活动 ,搞定高频面试题,斩杀面试官!

2.欢迎已加入星球的同学 免费申请一年编程导航网站会员

3.欢迎学习 鱼皮最新原创项目教程,手把手教你做出项目、写出高分简历!

加入我们

欢迎加入鱼皮的编程导航知识星球,鱼皮会 1 对 1 回答您的问题、直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。

💎 加入星球后,您可以:

1)添加鱼皮本人微信,向他 1 对 1 提问,帮您解决问题、告别迷茫!点击了解详情

2)获取海量编程知识和资源,包括:3000+ 鱼皮的编程答疑和求职指导、原创编程学习路线、几十万字的编程学习知识库、几十 T 编程学习资源、500+ 精华帖等!点击了解详情

3)找鱼皮咨询求职建议和优化简历,次数不限!点击了解详情

4)鱼皮直播从 0 到 1 带大家做出项目,已有 50+ 直播、完结 3 套项目、10+ 项目分享,帮您掌握独立开发项目的能力、丰富简历!点击了解详情

外面一套项目课就上千元了,而星球内所有项目都有指导答疑,轻松解决问题

星球提供的所有服务,都是为了帮您更好地学编程、找到理想的工作。诚挚地欢迎您的加入,这可能是最好的学习机会,也是最值得的一笔投资!

长按扫码领优惠券加入,也可以添加微信 yupi1085 咨询星球(备注“想加星球”):

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存